// //全排列问题--第一种搜索顺序
// #include <iostream>
// using namespace std;
// const int N=10;

// int n;
// char g[N][N];
// bool col[N],dg[N],udg[N];

// void dfs(int u)
// {
//    if(u==n)
//    {
//       for(int i=0;i<n;i++) puts(g[i]);
//       puts("");
//       return;
//    }

//    for(int i=0;i<n;i++)
//    {
//       if(!col[i]&&!dg[i+u]&&!udg[n-u+i]) //下标是斜线的截距
//       {
//          g[u][i]='Q';
//          col[i]=dg[u+i]=udg[n-u+i]=true;
//          dfs(u+1); //向下一层
//          col[i]=dg[u+i]=udg[n-u+i]=false;
//          g[u][i]='.';
//       }
//    }
// }

// int main()
// {
//    cin>>n;
//    for(int i=0;i<n;i++)
//    {
//         for(int j=0;j<n;j++)
//         {
//             g[i][j]='.';
//         }
//    }
//    dfs(0);
//    return 0;
// }


//n皇后问题---第二种搜索顺序
#include<iostream>
using namespace std;

const int N=20;
int n;
char g[N][N];
bool row[N],col[N],dg[N*2],udg[N*2];

void dfs(int x,int y,int s)
{
    //一行走到了尽头，则换行
    if(y==n)
    {
        y=0;
        x++;
    }
    //全部搜索完成 
    if(x==n)
    {
        if(s==n)
        {
            for(int i=0;i<n;i++) puts(g[i]);
            puts("");
        }
        return;
    }

    //不放皇后
    g[x][y]='.';
    dfs(x,y+1,s);

    //放皇后
    if(!col[y]&&!row[x]&&!dg[x+y]&&!udg[x-y+n])
    {
        g[x][y]='Q';
        row[x]=col[y]=dg[x+y]=udg[x-y+n]=true;
        dfs(x,y+1,s+1);
        row[x]=col[y]=dg[x+y]=udg[x-y+n]=false;
        g[x][y]='.';
    }
}

int main()
{
    cin>>n;
    dfs(0,0,0);
    return 0;
}

